# coding:utf8
"""

"""
import os, sys
import hashlib


def isStr(_a):
    try:
        _a.lower() + ''
        return True
    except: return False


class DeleteFile:
    """删除文件：
    删除一个或多个文件夹中的指定文件；
    删除指定 后缀 的文件；
    """
    f_file_path = '__file_path.txt'

    def __init__(self, target_dir, *args):
        if isStr(target_dir): self.TARGET_DIR = [target_dir]
        else: self.TARGET_DIR = target_dir
        self.TARGET_DIR.extend(args)

    def del_endswith(self, _ends, *args):
        """
        通过后缀删除文件。可以同时接收多个后缀。
        :param _ends: list or str
        :param args: str
        :return: Delete File
        """
        if isStr(_ends): _ends = [_ends]
        _ends.extend(args)
        input(f"你将要删除{self.TARGET_DIR}文件夹中{_ends}为后缀的文件\n确认要删除吗?")
        file_list = self.get_file_path()
        for _f in file_list:  # 遍历文件
            for _e in _ends:  # 遍历后缀
                if _f.endswith(_e):
                    print("正在删除", _f)
                    os.remove(_f)  # 判断文件的后缀并删除
        print(f"已经删除后缀为{_ends}的文件.")

    @staticmethod
    def del_file_in_list(_del_list):
        for f in _del_list: os.remove(f)

    def get_file_path(self):
        for dir_ in self.TARGET_DIR:
            os.system(f'dir /b /S /A:-D "{dir_}" >> {self.f_file_path}')
        file_list = open(self.f_file_path, 'r', encoding='gbk').read().split('\n')
        os.remove(self.f_file_path)
        # self.file_list = file_list
        return file_list


class DelRepeatFile(DeleteFile):
    """
    删除重复文件
    """

    def __init__(self, target_dir):
        """
        :param target_dir: list or str
        """
        super().__init__(target_dir)
        self.file_list = self.get_file_path()
        self.repeat_file_list = []

    def compare_file(self):
        """
        比对列表中的每一个文件，如果与前面的重复，添加到 Repeat File List.
        :return: list: Repeat file list
        """
        all_list = self.zip_md5_file()
        try:
            while True:
                file_, md5_ = all_list.pop(0)
                for _file, _md5 in all_list:
                    if md5_ == _md5: self.repeat_file_list.append(_file)
        except IndexError: pass

    def zip_md5_file(self):
        """
        把 MD5 和 文件路径 打包到 元组
        :return: list[tuple(filePath, md5), ]
        """
        _list = []
        print("*"*50 + "\n" + "  正在生成文件的MD5 ...  ".center(50, '*') + "\n" + '*'*50)
        for i in range(0, len(self.file_list)):
            try:
                print(f"\r* 正在生成文件{self.file_list[i]}的MD5值...", end='', flush=True)
                _list.append((self.file_list[i], self.calculate_md5(self.file_list[i])))
            except FileNotFoundError: print(f'\nNot Found File "{self.file_list[i]}"')
        print('\n')
        return _list

    @staticmethod
    def calculate_md5(file_path):
        """创建一个文件的MD5值， 返回MD5"""
        _m = hashlib.md5()
        with open(file_path, 'rb') as fb:
            while True:
                _data = fb.read(20480)
                if not _data: break
                _m.update(_data)
        return _m.hexdigest()


if __name__ == '__main__':
    file = 'iniRead.py'
    _dir = r'F:\H_temp'
    a = DelRepeatFile(_dir)
    # a.compare_file()
    a.del_endswith('torrent', 'chm', 'com.jpg', '1024.jpg', 'thm', 'url', 'mht', 'htm')
    # print(f"Repeat File List({len(a.repeat_file_list)}): ", a.repeat_file_list)
